/*
 * Copyright (C) 2008-2013 - Thomas Santana <tms@exnebula.org>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 */
package vcc.infra.fields

class UndefinedValueException() extends Exception()

class InvalidValueException(value:String,rule:String) extends Exception("Value '"+value+"' is invalid, reason:"+rule)

abstract sealed class FieldValue[+T] {
  def get:T
  def isDefined:Boolean
  def isValid:Boolean
  def storageString:String 
}

case object Undefined extends FieldValue[Nothing] {
  def get:Nothing = throw new UndefinedValueException()
  def isDefined = false
  def isValid = true
  def storageString = null
}

final case class Defined[+T](v:T) extends FieldValue[T]{
  def get = v  
  def isDefined = true
  def isValid = true
  def storageString = v.toString
}

final case class Invalid[+T](raw:String,reason:String) extends FieldValue[T] {
  def get = throw new InvalidValueException(raw,reason)
  def isDefined = false
  def isValid = false
  def storageString = raw
}